From: Keir Fraser Date: Thu, 27 Sep 2007 15:50:52 +0000 (+0100) Subject: x86: If e820 map overflows, leak memory in a safe manner. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14937^2~9 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=0d68d7c0fad3f6547413eddcd22bacaa65550d2b;p=xen.git x86: If e820 map overflows, leak memory in a safe manner. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/e820.c b/xen/arch/x86/e820.c index e678a4be52..2fbfa87160 100644 --- a/xen/arch/x86/e820.c +++ b/xen/arch/x86/e820.c @@ -416,11 +416,9 @@ int __init reserve_e820_ram(struct e820map *e820, uint64_t s, uint64_t e) /* Truncate end. */ e820->map[i].size -= e - s; } - else + else if ( e820->nr_map < ARRAY_SIZE(e820->map) ) { /* Split in two. */ - if ( e820->nr_map >= ARRAY_SIZE(e820->map) ) - return 0; memmove(&e820->map[i+1], &e820->map[i], (e820->nr_map-i) * sizeof(e820->map[0])); e820->nr_map++; @@ -429,6 +427,21 @@ int __init reserve_e820_ram(struct e820map *e820, uint64_t s, uint64_t e) e820->map[i].addr = e; e820->map[i].size = re - e; } + else + { + /* e820map is at maximum size. We have to leak some space. */ + if ( (s - rs) > (re - e) ) + { + printk("e820 overflow: leaking RAM %"PRIx64"-%"PRIx64"\n", e, re); + e820->map[i].size = s - rs; + } + else + { + printk("e820 overflow: leaking RAM %"PRIx64"-%"PRIx64"\n", rs, s); + e820->map[i].addr = e; + e820->map[i].size = re - e; + } + } return 1; }